package com.hzit.manager.client;

import com.hzit.common.util.R;
import com.hzit.manager.client.factory.UserFallbackFactory;
import com.hzit.manager.entity.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;


/**
 * 熔断处理：
 * 1、要添加依赖：（因为熔断器现被添加到sentinel组件中）
 *     <dependency>
 *         <groupId>com.alibaba.cloud</groupId>
 *         <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
 *     </dependency>
 * 2、在配置类上添加： @EnableFeignClients
 * 3、在定义的远程访问接口中，使用 @FeignClien注解。
 * 4、在使用@FeignClient注解时，有如下重要属性：
 *   ① value: 需要访问的微服务
 *   ② url: 如：url = "http://localhost:9000/user/list",代表访问远程的地址。
 *   ③ fallback: 指定进行熔断处理的类的Class类型，此类必须实现当前的Client接口，如：UserClient
 *     并且此类必须放在spring容器中。
 *   ④ fallbackFactory: 此属性指定熔断处理的工厂类，要求实现：FallbackFactory这个接口，并且其泛型就是当前的UserClient对象
 *     重写其中的create（）方法，在其中创建对UserClient接口的实现。（就是实现接口中所有的抽象方法）
 *   ⑤ 在传递参数时，需要使用 @RequestParam或@RequestBody,@PathVariable这类参数时，参数名字都不能省略，省略后就得不到值
 *      但我们一般在控制器中是可以省略的。
 */
//value: 需要访问的哪个微服务
//@FeignClient(value = "hzit-user",fallback = UserClient.UserFallBack.class)  // 使用fallback进行熔断处理
@FeignClient(value = "hzit-user",fallbackFactory = UserFallbackFactory.class)  // 使用fallback进行熔断处理
public interface UserClient {

	//1. 根据用户id查询用户
	@GetMapping("/user/findById")
	R findById();

	@GetMapping("/user/findById2")
	R findById2(@RequestParam("id") Integer id);

	@GetMapping("/user/findById3/{id}")
	R findById3(@PathVariable("id")  Integer id);

	@Component
	class UserFallBack implements UserClient{
		@Override
		public R findById() {
			return R.fail("{方法名：findById}[ 使用fallback属性进行熔断处理 ]hzit-user服务己关闭！");
		}

		@Override
		public R findById2(Integer id) {
			return R.fail("{方法名：findById2}[ 使用fallback属性进行熔断处理 ]hzit-user服务己关闭！");
		}

		@Override
		public R findById3(Integer id) {
			return R.fail("{方法名：findById3}[ 使用fallback属性进行熔断处理 ]hzit-user服务己关闭！");
		}
	}
}
